package demo.reflect;

/**
 * @ClassName ReflectTarget
 * @Description
 * @Author 47980
 * @Date 2020/6/10 20:47
 * @Version V_1.0
 **/
public class ReflectTarget extends ReflectTargetOrigin {
    //-------构造函数--------
    //默认的带参数构造函数 包可见
    ReflectTarget(String string) {
        System.out.println("(默认)构造方法 s = " + string);
    }
    //无参构造函数
    public ReflectTarget() {
        System.out.println("调用了共有的无参构造方法....");
    }

    //有一个参数的构造函数
    public ReflectTarget(char name) {
        System.out.println("调用了带有一个参数的构造方法，参数值为:" + name);
    }

    //有多个参数的构造函数
    public ReflectTarget(String name, int index) {
        System.out.println("调用了带有多个参数的构造函数，参数值为[目标名]："+name+"，[序号]："+index);
    }

    //受保护的构造函数
    protected ReflectTarget(boolean n) {
        System.out.println("受保护的构造方法：n = "+n);
    }

    //私有的构造函数
    private ReflectTarget(int index) {
        System.out.println("私有的构造方法：index = "+ index);
    }

    //**************** 字段 *****************//
    public String name;
    protected int index;
    char type;
    private String targetInfo;

    //**************** 成员方法 *****************//
    public void show1(String s) {
        System.out.println("调用了公有的，String参数的 show1():s = "+s);
    }

    protected void show2() {
        System.out.println("调用了受保护的 show2()");
    }

    void show3() {
        System.out.println("调用了包可见的，show3()");
    }

    private String show4(String targetInfo, int index) {
        System.out.println("调用了私有的，String参数的，show4():targetInfo = " + targetInfo + ", index = " + index);
        return targetInfo + "_" + index;
    }

    @Override
    public String toString() {
        return "ReflectTarget [name = "+name+", index = "+index+", type = "+type+", targetInfo = "+targetInfo+"]";
    }

    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式获取Class对象
        ReflectTarget reflectTarget = new ReflectTarget();
        Class class1 = reflectTarget.getClass();
        System.out.println("1st:" + class1.getName());

        //第二种方式获取Class对象
        Class class2 = ReflectTarget.class;
        System.out.println("2nd:" + class2.getName());

        //判断第一种方式获取的第二种方式获取的是否是同一个
        System.out.println(class1 == class2);

        //第三种方式获取Class对象
        Class class3 = Class.forName("demo.reflect.ReflectTarget");
        System.out.println("3rd: " + class3.getName());
        System.out.println(class2 == class3);
    }
}
